#include<func.h>
//通过设置线程锁属性，用mutex实现两个进程各加2千万，最终实现4千万
#define NUM 20000000

typedef struct{
    int num;
    pthread_mutex_t mutex;
}data_t;

int main()
{
    int shmid;
    shmid=shmget(1000,4096,IPC_CREAT|0666);//创建共享内存
    ERROR_CHECK(shmid,-1,"shmget");
    printf("shmid=%d\n",shmid);
    data_t *p=shmat(shmid,NULL,0);//将共享内存连接到本程序内
    ERROR_CHECK(p,(data_t*)-1,"shmat");
    p->num=0;
    int i;
    pthread_mutexattr_t mutex_attr;//定义一个锁属性
    pthread_mutexattr_init(&mutex_attr);//初始化锁属性
    pthread_mutexattr_setpshared(&mutex_attr,PTHREAD_PROCESS_SHARED);//把锁属性设置为可以在进程间使用
    int ret=pthread_mutex_init(&p->mutex,&mutex_attr);//初始化锁,第二个参数是锁属性
    time_t start,end;
    start=time(NULL);//开始计时
    if(!fork())
    {
        for(i=0;i<NUM;i++)
        {
            pthread_mutex_lock(&p->mutex);//加锁
            p->num+=1;//加两千万
            pthread_mutex_unlock(&p->mutex);//解锁
        }
        return 0;
    }
    else{
        for(i=0;i<NUM;i++)
        {
            pthread_mutex_lock(&p->mutex);//加锁
            p->num+=1;//加两千万
            pthread_mutex_unlock(&p->mutex);//解锁
        }
        wait(NULL);//等待子进程
        end=time(NULL);//结束计时
        printf("result=%d,use time=%ld\n",p->num,end-start);
        return 0;
    }
}